這篇是 Mapping 系列的最後一篇
主要介紹 Metadata fields 和 Mapping parameters
每一個document都會有metadata fields,記錄著此document的metadata
下列我挑幾一些個人覺得比較常用到的來說明
_index: document屬於哪一個index
_type: 此document的 mapping type (更詳細的介紹可參閱 Elastic Stack第十四重)
_id: document的ID,此field是可以用在某些queries,也可以用在 aggs 和 sorting ,但是官方不建議用 _id field來 aggs 和 sorting ,如果真有需要就額外新增一個 field,且複製 _id 內容至新增的field
_source: 此document在新增的時候的原始JSON, _source field 本身沒有被建立索引,也因此是無法搜尋的,儲存的內容主要是 fetch requests (get/search) 的回傳值
_meta: 關於 mapping type 的 meta data
即 field mappings 使用的參數
以下針對幾個個人覺得比較可能會使用到的來說明,
注意的是,不是每個field type都會有這些參數
analyzer
es預設的 analyzer 為 standard,
可以透過此參數指定 text analysis 的 analyzer ,
除非有指定 search_analyzer ,不然此 analyzer 會套用在 indexing 和 searching 的時機點
[注意] 只有 text fields支援 analyzer 參數,
boost
此參數預設值為 1 ,
設定此參數會讓 field 在 query時,影響計算的相關分數,
例如: title field設定 boost 為 2, 而 content field不設定 boost (即預設的1),此時如果在搜尋時匹配到 title 的權重會是匹配到 content 的兩倍
如果想要讓某 field 的權重變更,除了可以在 mapping設定此參數,
也可以直接在搜尋 (e.g., term queries) 設定權重
copy_to
此參數可以讓你複製多個fields的value至一個group field,
之後就可直接搜尋 group field來達成搜尋多個欄位
如果很常搜尋多個fields,可以用此方式來增加搜尋速度
舉個設定的範例
PUT my-index-000012
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}
之後如要搜尋 first_name 和 last_name,則可以直接使用 full_name
[Note]
copy_to 可以設定不只一個field,如多個fields,可以使用 array,如 "copy_to": [ "field_1", "field_2" ]
field_1 至 field_2 ,又設定 copy field_2 至 field_3 ,是沒辦法如表面上的會把 field_1 複製至 field_3
_source 是不會顯示 copied values ,所以是沒辦法用 _source 查看內的 group field 內的值的個人覺得這個很常用在搜尋框,搜尋框一般而言都是希望可以搜尋很多個欄位的值,就可以透過
copy_to至 group field 達成
doc_values
除了 text 和 annotated_text fields,都有此參數,且預設皆是開啟的(true),
除非field真的不需要 aggs , sort 或是 script不會取用field,才把 doc_values 關掉來省硬碟空間
enabled
es預設都是會對fields建立索引的,但有些時候是只想儲存值而不想建立索引,此時可以透過此參數來設定,不過這參數只能用在 top-level mapping 且 只有 object field data type 有這參數設定
舉個情境:像是 session,可能會想透過 session ID來取得document,但其中的 session data可能就不需要被用來搜尋或 aggs 等
fielddata
如果 text fields 也想用來 aggs , sort ,
但是 text 沒有 doc_values 參數可用,那怎麼辦?text fields 可以使用一種資料結構,是會在 query 時,儲存在memory的,即為 fielddata
fielddata 參數預設是關閉的 (false),因為他會使用很多 heap space,
此外,loading fielddata 是個很 expensive 的過程,很有可能會讓使用者感受到延遲
如果真需要根據 text field value做 sorting 或 aggs 可使用 multi-fields ,
可參閱 Elastic Stack第十七重
formatdate field type有介紹到,es提供了很多格式,提供的哪些格式可參閱官方介紹,就不多加闡述了
format
ignore_above
如果string超過此參數設定的長度,則不會被建立索引,不過還是會存在 _source 內
index
此field values是否被建立索引,預設是 true
如果沒有建立索引是不可被搜尋的
meta
field的metadata
情境:有多個應用程式會對同一index做操作,此時可以針對field提供一些metadata,想是 units(單位)
fields
也就是如何達成 multi-fields 的參數,詳細內容可參閱 Elastic Stack第十七重
null_valuenull 值是不會被建立索引的,
透過此參數,可以設定當 null 值出現時,用指定的值來取代
[Note]
null_value 設定的值必須與此field的field data type一樣才行null_value 只是影響資料是如何被建立索引,不會影響 _source 儲存的JSONproperties
不管是 top-level 的type mapping,還是 object 或 nested 包含的 sub-fields都是使用此參數
similarity
用此參數可設定計算分數的演算法,預設為 BM25
小小新手,如有理解錯誤或寫錯再請不吝提醒或糾正
Metadata fields
Mapping parameters